#pragma once

#include <chrono>
#include <cmath>
#include <iomanip>
#include <iostream>
#include <string>
#include <utility>
#include <vector>

#include "cv_puttext.h"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
// typedef std::pair<float, float> PFF;

class BASEHACKREGION {
   public:
    BASEHACKREGION(std::vector<std::pair<int, int>>);
    BASEHACKREGION(int region[][2], int pointNums);
    BASEHACKREGION(std::vector<cv::Point> region);
    BASEHACKREGION();
    // cv::Mat maskRegion(cv::Mat image);
    bool detectHack(cv::Point targetPoint);                  // 判断点是否在区域内
    void showRegion(cv::Mat& image);                         // 画区域线并将区域显示在图像上
    void showRegion(cv::Mat& image, int width, int height);  // 画区域线并将区域显示在图像上，并对显示窗口进行resize
    void drawRegion(cv::Mat& image);                         // 画区域线，不显示在图像上
    bool sendflag;                                           // 是否发送报警信号
    long long region_start_alert_time;                       // 区域发生alert时间
    bool region_last_squeeze_flag;                           // 报警是否连续发生
    long long region_last_sendalret_time;                    // 上次发送alert警报的时间
    std::vector<cv::Point> hack_region;                      // 存储入侵区域线段点
   private:
    long long Get_Current_Timestamp();                                                                         // 获取当前时间戳
    bool IsPointInPolygon(cv::Point targetPoint);                                                              // 判断点是否在多边形内(点在多边形的边上也算在内部)
    bool IsPointOnLine(float px0, float py0, float px1, float py1, float px2, float py2);                      // 判断点在线段上
    bool IsIntersect(float px1, float py1, float px2, float py2, float px3, float py3, float px4, float py4);  // 判断两线段相交
};
